/**
 * 
 */
package org.stars.daostars.core.parser;


import java.util.Collection;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stars.daostars.core.Profile;
import org.stars.daostars.core.SqlQuery;
import org.stars.daostars.core.SqlQueryReference;
import org.stars.daostars.sqlmapper.SqlMapper;

/**
 * Recupera le query incluse in un dao
 * 
 * @author Francesco Benincasa (908099)
 * @date 14/gen/08, 22:28:43
 * 
 */
public abstract class FindIncludedQuery {
	/**
	 * Per ogni daoDefinition, cerca di risolvere tutte le query incluse
	 * 
	 * @param profile
	 *            profilo dei dao.
	 * @return <code>true</code> in caso di errore
	 * @throws Exception
	 *             in caso di errore
	 */
	public static boolean execute(Profile profile) throws Exception {

		Collection<SqlMapper> daos = profile.getSqlMapperSet().values();

		for (SqlMapper item : daos) {
			findIncludedQuery(item, profile);
		}

		return true;
	}
	
	protected static Log getLog()
	{
		return LogFactory.getLog(FindIncludedQuery.class);
	}

	/**
	 * Per un dao all'interno di un profilo, cerca di risolvere tutte le query
	 * incluse e definite in qualche altro dao.
	 * 
	 * @param dao
	 *            dao per il quale devono essere risolte tutte le query
	 * @param currentProfile
	 *            profilo corrente.
	 * @return <code>true</code> se tutto è andato bene.
	 * @throws Exception
	 *             in caso di errore
	 */
	private static boolean findIncludedQuery(SqlMapper dao, Profile currentProfile) throws Exception {
		
		Map<String, SqlQueryReference> sqlQuerySet = dao.getQueryReferenceSet();

		SqlMapper referredDao;

		for (SqlQueryReference item : sqlQuerySet.values()) {
			// verifichiamo che le reference query non siano presenti anche come
			// query
			if (dao.existsQuery(item.getQueryAlias())) {
				Log log=getLog();
				log.error("Problem during query including! In the dao " + dao.getName() + " the query " + item.getQueryAlias() + " is already defined! The defined query is used");
				continue;
			}

			referredDao = currentProfile.getSqlMapperSet().get(item.getDaoName());

			if (referredDao != null) {
				SqlQuery referredQuery = referredDao.getQuery(item.getQueryName());

				if (referredQuery != null) {
					dao.setQuery(item.getQueryAlias(), referredQuery);
				}
			}
		}

		return true;
	}
}
